<?php

if (!defined('BASEPATH'))
  exit('No direct script access allowed');
/**
 * Code Igniter
 *
 * An open source application development framework for PHP 5.1.6 or newer
 *
 * @package		CodeIgniter
 * @author		ExpressionEngine Dev Team
 * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc.
 * @license		http://codeigniter.com/user_guide/license.html
 * @link		http://codeigniter.com
 * @since		Version 1.0
 * @filesource
 */
// ------------------------------------------------------------------------

/**
 * Database Utility Class
 *
 * @category	Database
 * @author		ExpressionEngine Dev Team
 * @link		http://codeigniter.com/user_guide/database/
 */
class CI_DB_forge {

  var $fields = array();
  var $keys = array();
  var $primary_keys = array();
  var $db_char_set = '';

  /**
   * Constructor
   *
   * Grabs the CI super object instance so we can access it.
   *
   */
  function __construct() {
    // Assign the main database object to $this->db
    $CI = & get_instance();
    $this->db = & $CI->db;
    log_message('debug', "Database Forge Class Initialized");
  }

  // --------------------------------------------------------------------

  /**
   * Create database
   *
   * @access	public
   * @param	string	the database name
   * @return	bool
   */
  function create_database($db_name) {
    $sql = $this->_create_database($db_name);

    if (is_bool($sql)) {
      return $sql;
    }

    return $this->db->query($sql);
  }

  // --------------------------------------------------------------------

  /**
   * Drop database
   *
   * @access	public
   * @param	string	the database name
   * @return	bool
   */
  function drop_database($db_name) {
    $sql = $this->_drop_database($db_name);

    if (is_bool($sql)) {
      return $sql;
    }

    return $this->db->query($sql);
  }

  // --------------------------------------------------------------------

  /**
   * Add Key
   *
   * @access	public
   * @param	string	key
   * @param	string	type
   * @return	void
   */
  function add_key($key = '', $primary = FALSE) {
    if (is_array($key)) {
      foreach ($key as $one) {
        $this->add_key($one, $primary);
      }

      return;
    }

    if ($key == '') {
      show_error('Key information is required for that operation.');
    }

    if ($primary === TRUE) {
      $this->primary_keys[] = $key;
    } else {
      $this->keys[] = $key;
    }
  }

  // --------------------------------------------------------------------

  /**
   * Add Field
   *
   * @access	public
   * @param	string	collation
   * @return	void
   */
  function add_field($field = '') {
    if ($field == '') {
      show_error('Field information is required.');
    }

    if (is_string($field)) {
      if ($field == 'id') {
        $this->add_field(array(
            'id' => array(
                'type' => 'INT',
                'constraint' => 9,
                'auto_increment' => TRUE
            )
        ));
        $this->add_key('id', TRUE);
      } else {
        if (strpos($field, ' ') === FALSE) {
          show_error('Field information is required for that operation.');
        }

        $this->fields[] = $field;
      }
    }

    if (is_array($field)) {
      $this->fields = array_merge($this->fields, $field);
    }
  }

  // --------------------------------------------------------------------

  /**
   * Create Table
   *
   * @access	public
   * @param	string	the table name
   * @return	bool
   */
  function create_table($table = '', $if_not_exists = FALSE) {
    if ($table == '') {
      show_error('A table name is required for that operation.');
    }

    if (count($this->fields) == 0) {
      show_error('Field information is required.');
    }

    $sql = $this->_create_table($this->db->dbprefix . $table, $this->fields, $this->primary_keys, $this->keys, $if_not_exists);

    $this->_reset();
    return $this->db->query($sql);
  }

  // --------------------------------------------------------------------

  /**
   * Drop Table
   *
   * @access	public
   * @param	string	the table name
   * @return	bool
   */
  function drop_table($table_name) {
    $sql = $this->_drop_table($this->db->dbprefix . $table_name);

    if (is_bool($sql)) {
      return $sql;
    }

    return $this->db->query($sql);
  }

  // --------------------------------------------------------------------

  /**
   * Rename Table
   *
   * @access	public
   * @param	string	the old table name
   * @param	string	the new table name
   * @return	bool
   */
  function rename_table($table_name, $new_table_name) {
    if ($table_name == '' OR $new_table_name == '') {
      show_error('A table name is required for that operation.');
    }

    $sql = $this->_rename_table($this->db->dbprefix . $table_name, $this->db->dbprefix . $new_table_name);
    return $this->db->query($sql);
  }

  // --------------------------------------------------------------------

  /**
   * Column Add
   *
   * @access	public
   * @param	string	the table name
   * @param	string	the column name
   * @param	string	the column definition
   * @return	bool
   */
  function add_column($table = '', $field = array(), $after_field = '') {
    if ($table == '') {
      show_error('A table name is required for that operation.');
    }

    // add field info into field array, but we can only do one at a time
    // so we cycle through

    foreach ($field as $k => $v) {
      $this->add_field(array($k => $field[$k]));

      if (count($this->fields) == 0) {
        show_error('Field information is required.');
      }

      $sql = $this->_alter_table('ADD', $this->db->dbprefix . $table, $this->fields, $after_field);

      $this->_reset();

      if ($this->db->query($sql) === FALSE) {
        return FALSE;
      }
    }

    return TRUE;
  }

  // --------------------------------------------------------------------

  /**
   * Column Drop
   *
   * @access	public
   * @param	string	the table name
   * @param	string	the column name
   * @return	bool
   */
  function drop_column($table = '', $column_name = '') {

    if ($table == '') {
      show_error('A table name is required for that operation.');
    }

    if ($column_name == '') {
      show_error('A column name is required for that operation.');
    }

    $sql = $this->_alter_table('DROP', $this->db->dbprefix . $table, $column_name);

    return $this->db->query($sql);
  }

  // --------------------------------------------------------------------

  /**
   * Column Modify
   *
   * @access	public
   * @param	string	the table name
   * @param	string	the column name
   * @param	string	the column definition
   * @return	bool
   */
  function modify_column($table = '', $field = array()) {
    if ($table == '') {
      show_error('A table name is required for that operation.');
    }

    // add field info into field array, but we can only do one at a time
    // so we cycle through

    foreach ($field as $k => $v) {
      // If no name provided, use the current name
      if (!isset($field[$k]['name'])) {
        $field[$k]['name'] = $k;
      }

      $this->add_field(array($k => $field[$k]));

      if (count($this->fields) == 0) {
        show_error('Field information is required.');
      }

      $sql = $this->_alter_table('CHANGE', $this->db->dbprefix . $table, $this->fields);

      $this->_reset();

      if ($this->db->query($sql) === FALSE) {
        return FALSE;
      }
    }

    return TRUE;
  }

  // --------------------------------------------------------------------

  /**
   * Reset
   *
   * Resets table creation vars
   *
   * @access	private
   * @return	void
   */
  function _reset() {
    $this->fields = array();
    $this->keys = array();
    $this->primary_keys = array();
  }

}

/* End of file DB_forge.php */
/* Location: ./system/database/DB_forge.php */